Completed
Push — master ( fdd593...5aa3de )
by Andres
30s
created

angular.service(ꞌreactionꞌ)   B

Complexity

Conditions 8
Paths 6

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
c 1
b 0
f 0
nc 6
dl 0
loc 20
rs 7.7777
nop 3
1
/**
2
 reaction
3
 Service that processes a reaction i.e. it converts reactants to products.
4
 Many phenomenons, including decay, redox and reactions, use the react function.
5
6
 @namespace Services
7
 */
8
'use strict';
9
10
angular
11
  .module('game')
12
  .service('reaction', ['state','util',
13
    function(state, util) {
14
      // FIXME: move to util?
15
        function isReactionCostMet (number, reaction, playerData) {
16
          let keys = Object.keys(reaction.reactant);
17
          for (let i = 0; i < keys.length; i++) {
18
            let available = playerData.resources[keys[i]].number;
19
            let required = number * reaction.reactant[keys[i]];
20
            if (required > available) {
21
              return false;
22
            }
23
          }
24
          return true;
25
        }
26
27
      /* Transforms reactants to products */
28
      this.react = function(number, reaction, playerData) {
29
        if (!Number.isInteger(number) || number <= 0 ||
30
            !reaction.reactant || !reaction.product) {
31
          return;
32
        }
33
        if (isReactionCostMet(number, reaction, playerData)) {
34
          let reactant = Object.keys(reaction.reactant);
35
          for (let i = 0; i < reactant.length; i++) {
36
            let required = number * reaction.reactant[reactant[i]];
37
            playerData.resources[reactant[i]].number -= required;
38
            playerData.resources[reactant[i]].number = playerData.resources[reactant[i]].number;
39
          }
40
          let product = Object.keys(reaction.product);
41
          for (let i = 0; i < product.length; i++) {
42
            let produced = number * reaction.product[product[i]];
43
44
            util.addResource(playerData.resources[product[i]], product[i], produced);
45
          }
46
        }
47
      };
48
    }
49
  ]);
50